![Amazon FSx for LustreをCloudFormationで構築する](https://devio2023-media.developers.io/wp-content/uploads/2019/05/amazon-fsx-for-lustre.png)
Amazon FSx for LustreをCloudFormationで構築する
FSx for Lustreを検証するためにリソースを作成するテンプレートを作りました。Lustreの構築はもちろん、検証したいときだけ気軽に作成して削除できます。肝心なデータはLustreから透過的にS3バケットへ保存し利用します。データを残しておくと次回検証時に同じS3バケットからインポートすることで低コストに環境を維持できます。
2022/2/16追記ブラッシュアップしたサンプルテンプレートを作成しました
前提
- VPCとサブネット1個を構築済みの環境
- FSx for Lustreと連携するS3バケット1個
テンプレート
実行順序
- Security Group
- FSx for Lustre
Security Group
FSx for LustreにアタッチするセキュリティグープにはTCPの988, 1021-1023ポートの許可が必要です。 マネジメントコンソールから作成するときも説明されています。
ドキュメントを参照するとFSx for Lustreにアタッチするセキュリティグープからの自己参照と、LustreをマウントするEC2などリソースから上記ポートを許可する必要がありました。
上記条件を反映したセキュリティグープ設定は下記になります。
--- AWSTemplateFormatVersion: "2010-09-09" Description: Create Security Group*2 Metadata: AWS::CloudFormation::Interface: ParameterGroups: - Label: default: Common Settings Parameters: - ProjectName - Environment - Label: default: VPC Parameters: - VPCID Parameters: ProjectName: Description: Project Name Type: String Default: unnamed Environment: Description: Environment Type: String Default: dev AllowedValues: - prod - dev - stg VPCID: Type: AWS::EC2::VPC::Id Resources: # Create Security Group # EC2 to mount Lustre SecurityGroup1: Type: AWS::EC2::SecurityGroup Properties: GroupName: !Sub ${ProjectName}-${Environment}-ec2-mount-lustre-sg GroupDescription: EC2 to mount Lustre Security Group SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: "0.0.0.0/0" Description: "Access from Public" VpcId: !Ref VPCID Tags: - Key: Name Value: !Sub ${ProjectName}-${Environment}-ec2-mount-lustre-sg # FSx for Lustre SecurityGroup2: Type: AWS::EC2::SecurityGroup Properties: GroupName: !Sub ${ProjectName}-${Environment}-lustre-sg GroupDescription: FSx for Lustre Security Group SecurityGroupIngress: - IpProtocol: tcp FromPort: 2049 ToPort: 2049 SourceSecurityGroupId: !Ref SecurityGroup1 Description: "Access from EC2 to mount Lustre" - IpProtocol: tcp FromPort: 988 ToPort: 988 SourceSecurityGroupId: !Ref SecurityGroup1 Description: "Access from EC2 to mount Lustre" - IpProtocol: tcp FromPort: 1021 ToPort: 1023 SourceSecurityGroupId: !Ref SecurityGroup1 Description: "Access from EC2 to mount Lustre" VpcId: !Ref VPCID Tags: - Key: Name Value: !Sub ${ProjectName}-${Environment}-lustre-sg SecurityGroup2Ingress1: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: !Ref SecurityGroup2 IpProtocol: tcp FromPort: 988 ToPort: 988 SourceSecurityGroupId: !GetAtt SecurityGroup2.GroupId Description: "Access from Lustre LNET network" SecurityGroup2Ingress2: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: !Ref SecurityGroup2 IpProtocol: tcp FromPort: 1021 ToPort: 1023 SourceSecurityGroupId: !GetAtt SecurityGroup2.GroupId Description: "Access from Lustre LNET network" Outputs: ExportSG1: Value: !Ref SecurityGroup1 Export: Name: !Sub ${AWS::StackName}-SG1 ExportSG2: Value: !Ref SecurityGroup2 Export: Name: !Sub ${AWS::StackName}-SG2
FSx for Lustre
SCRATCH_2
タイプで作成しています。テンプレートの設定値をマネジメントコンソールから確認すると以下の値です。
--- AWSTemplateFormatVersion: "2010-09-09" Description: Create Lustre*1 Metadata: AWS::CloudFormation::Interface: ParameterGroups: - Label: default: Common Settings Parameters: - ProjectName - Environment - Label: default: Lustre Settings Parameters: - LustreSubnetID1 Parameters: ProjectName: Description: Project Name Type: String Default: unnamed Environment: Description: Environment Type: String Default: dev AllowedValues: - prod - dev - stg LustreSubnetID1: Type: AWS::EC2::Subnet::Id StackNameSG: Type: String Description: Stack name of SecurityGroup ImportS3BucketName: Type: String Default: "s3://hoge" Resources: FSxFileSystem: Type: "AWS::FSx::FileSystem" Properties: FileSystemType: "LUSTRE" StorageCapacity: 1200 SubnetIds: - !Ref "LustreSubnetID1" SecurityGroupIds: - Fn::ImportValue: !Sub "${StackNameSG}-SG2" LustreConfiguration: AutoImportPolicy: "NEW" ImportPath: !Ref "ImportS3BucketName" ExportPath: !Sub "${ImportS3BucketName}/export" ImportedFileChunkSize: 1024 WeeklyMaintenanceStartTime: "6:20:00" DeploymentType: "SCRATCH_2" DataCompressionType: "LZ4" StorageType: "SSD" Tags: - Key: "Name" Value: !Sub ${ProjectName}-${Environment}-lustre Outputs: ExportLustreID: Value: !Ref FSxFileSystem Export: Name: !Sub "${AWS::StackName}-LustreID1" ExportLustreMountName: Value: !GetAtt "FSxFileSystem.LustreMountName" Export: Name: !Sub "${AWS::StackName}-LustreMountName1" ExportLustreDNSName: Value: !GetAtt "FSxFileSystem.DNSName" Export: Name: !Sub "${AWS::StackName}-LustreDNSName1"
TIPS
FSx for Lustreをテンプレートからデプロイ時にLustreへアタッチするセキュリティグープに自己参照して許可するTCP 988
を抜かした場合のエラーです。ちなみにTCP 1021-1023
は許可しなくてもLustreのデプロイは成功しました。デプロイ時には必要ではなくても後々使われるのでしょう。注意してください。
The file system cannot be created because the default security group in the subnet provided or the provided security groups do not permit Lustre LNET network traffic on port 988 (Service: AmazonFSx; Status Code: 400; Error Code: InvalidNetworkSettings; Request ID: f321b930-acf3-47a6-84c3-21cbfd6b30e8; Proxy: null)
FSx for Lustreマウント確認
以下のドキュメントを参考にAmazon Linux2からFSx for Lustreをマウントし接続確認を行います。
Mounting from an Amazon EC2 I instance - Amazon FSx for Lustre
mount
コマンドの引数で必要なLustreDNSName
とLustreMountName
はスタックのアウトプットに値を出力しています。参考にしてください。
また、FSx for Lustreの管理画面からも同じ値を確認できます。
/mnt/lustre
配下にLustreをマウントします。mount
コマンドの書式は以下です。引数の値はご自身の環境に合わせて変更してください。
sudo mount -t lustre -o noatime,flock [LustreDNSName]@tcp:/[LustreMountName] /mnt/lustre
実際にマウントしたときのコマンド例
sudo amazon-linux-extras install -y lustre2.10 sudo mkdir /mnt/lustre sudo mount -t lustre -o noatime,flock fs-05a0d371dac49defc.fsx.ap-northeast-1.amazonaws.com@tcp:/d2whnbmv /mnt/lustre
Lustreを認識できています。まだLustre上にファイルをロードしていません。ディスク使用量は4.4MBです。
> lfs df -h UUID bytes Used Available Use% Mounted on d2whnbmv-MDT0000_UUID 34.4G 5.4M 34.4G 0% /mnt/lustre[MDT:0] d2whnbmv-OST0000_UUID 1.1T 4.4M 1.1T 0% /mnt/lustre[OST:0] filesystem_summary: 1.1T 4.4M 1.1T 0% /mnt/lustre
サンプルで事前に連携するS3バケットへファイルを保存していました。S3バケット内のファイルをLustreを通して透過的に確認できています。
> ll /mnt/lustre/ total 26K drwxr-xr-x 2 root root 25K Jun 17 00:30 export/ -rwxr-xr-x 1 root root 2.0G Jun 15 01:59 windAuroundBuildings.tar.gz*
Lustreにロードしていないのでreleased
の表示です。
> lfs hsm_state ./windAuroundBuildings.tar.gz ./windAuroundBuildings.tar.gz: (0x0000000d) released exists archived, archive_id:1
試しに2GBのファイルをロードしてみます。lfs hsm_action
コマンドでNOOP表示を確認できればロード完了です。
> sudo lfs hsm_restore ./windAuroundBuildings.tar.gz > sudo lfs hsm_action ./windAuroundBuildings.tar.gz /mnt/lustre/windAuroundBuildings.tar.gz: NOOP
released
の表示がなくなり、Lustre上へS3のファイルがロードされた状態です。
> lfs hsm_state ./windAuroundBuildings.tar.gz ./windAuroundBuildings.tar.gz: (0x00000009) exists archived, archive_id:1
あらためてLustreのディスク使用量を確認すると2.0GBあり、Lustre上にファイルが置かれています。容量についてはLustreの圧縮機能を有効化してるので多少容量が削減できているのか、丸められただけなのかは判斷つきませんでした。
> lfs df -h UUID bytes Used Available Use% Mounted on d2whnbmv-MDT0000_UUID 34.4G 5.5M 34.4G 0% /mnt/lustre[MDT:0] d2whnbmv-OST0000_UUID 1.1T 2.0G 1.1T 0% /mnt/lustre[OST:0] filesystem_summary: 1.1T 2.0G 1.1T 0% /mnt/lustre
おわりに
FSx for Lustreを長時間起動していると料金が気になってきました。Lustreに置きたい必要なデータはS3からインポート、エクスポートで運用します。キャッシュレイヤーの位置づけのLustreは検証の都度、構築・削除をテンプレート化により容易にできるようになりました。経済的に検証できます。